gaussian elimination with partial pivoting